本篇文章同步更新於個人部落格,歡迎交流指教~謝謝您的閱讀
前一篇文章 說明了在 Nuxt3 搭配 Pinia 狀態管理工具全域共享狀態,本篇將介紹 pinia-plugin-persistedstate
套件,用來將 Store 狀態儲存於瀏覽器中,避免狀態被還原
pinia-plugin-persistedstate
用來將 Store 狀態保存於使用者的瀏覽器中,以下兩個情境推薦使用:
搭配 Nuxt 整合模組 @pinia-plugin-persistedstate/nuxt
進行安裝:
npm install -D @pinia-plugin-persistedstate/nuxt
pinia-plugin-persistedstate
必須搭配 Pinia 使用
// nuxt.config.js
export default defineNuxtConfig({
modules: [
'@pinia/nuxt',
'@pinia-plugin-persistedstate/nuxt'
]
})
將 persist 參數設定為 true
// store/index.js
export const useMainStore = defineStore('main', {
state: () => ({
counter: 0
}),
getters: {
doubleCounter() {
return this.counter * 2;
}
},
actions: {
increment() {
this.counter++;
}
},
persist: true
});
defineStore
傳入參數 { persist: true }
// store/index.js
export const useMainStore = defineStore(
'main',
() => {
const counter = ref(0);
const doubleCounter = computed(() => counter.value * 2);
const increment = () => {
counter.value++;
};
return {
counter,
doubleCounter,
increment
};
},
{
persist: true
}
);
預設配置:
cookie
store.$id
JSON.stringify()
與 JSON.parse()
進行序列化 / 反序列化型別:
string
預設值:store.$id
以下為例,預設 key 為 main
,調整為 my-custom-key
// store/index.js
export const useMainStore = defineStore('main',
() => {
// ...
},
{
persist: {
key: 'my-custom-key'
}
}
);
在儲存庫可以看到調整後的 key 值
預設值:
cookie
選項:localStorage
、sessionStorage
、cookie
使用自動引入的 persistedState
變數進行配置
// store/index.js
export const useMainStore = defineStore('main',
() => {
// ...
},
{
persist: {
storage: persistedState.localStorage
}
}
);
因 storage 只存在瀏覽器端,如果未搭配
persistedState
定義,在ssr
會出現錯誤,也可以透過判斷式定義:{ persist: { storage: process.client ? localStorage : null } }
cookiesWithOptions()
用來設定 cookie,選項同 Nuxt Composable useCookie,storage 需為 cookie 才能使用
// store/index.js
export const useMainStore = defineStore('main',
() => {
// ...
},
{
persist: {
storage: persistedState.cookiesWithOptions({
sameSite: 'strict'
})
}
}
);
型別:
string[]
預設值:undefined
預設整個 state 都會被保存在 storage。如果想指定參數,使用 paths 進行調整
// store/index.js
export const useMainStore = defineStore('main',
() => {
const counter = ref(0);
const user = ref({
name: 'Daniel',
age: 18
});
},
{
persist: {
paths: [
'user.name'
]
}
}
);
預設值:
JSON.stringify
、JSON.parse
指定序列化方法(必須包含 serialize
、deserialize
),以下範例調整為壓縮檔
// store/index.js
import { parse, stringify } from 'zipson';
export const useMainStore = defineStore('main',
() => {
// ...
},
{
persist: {
serializer: {
serialize: stringify,
deserialize: parse
}
}
}
);
型別:
boolean
預設值:false
設定為 true,當發生任何錯誤,都會使用 conosle.error
印出
在 nuxt.config
使用 piniaPersistedstate
全域調整選項
// nuxt.config.js
export default defineNuxtConfig({
modules: [
'@pinia/nuxt',
'@pinia-plugin-persistedstate/nuxt'
],
piniaPersistedstate: {
storage: 'cookie',
cookieOptions: {
sameSite: 'strict'
}
}
})
參考資源:
https://prazdevs.github.io/pinia-plugin-persistedstate/